package ml.kupin.sso.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import ml.kupin.common.jedis.JedisClient;
import ml.kupin.common.utils.KuPinResult;
import ml.kupin.mapper.TbUserMapper;
import ml.kupin.pojo.TbUser;
import ml.kupin.pojo.TbUserExample;
import ml.kupin.sso.service.LoginService;
import ml.kupin.sso.utils.EncryptUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.UUID;

/**
 * Created by 小柯(Allen Kerr) on 17.5.6 14:51.
 */
@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private TbUserMapper userMapper;
    @Autowired
    private JedisClient jedisClient;

    @Value("${user_info_prefix}")
    private String user_info_prefix;
    @Value("${user_info_lifetime}")
    private int user_info_lifetime;

    private Logger logger = LoggerFactory.getLogger(LoginServiceImpl.class);

    /**
     * 检查登陆信息，判断是否登陆成功，
     * 登陆成功之后，生成session信息，保存到redis中
     *
     * @param user
     * @return
     */
    @Override
    public KuPinResult checkLogin(TbUser user) {
        //1、 判断用户名密码是否正确。
        TbUserExample userExample = new TbUserExample();
        userExample.createCriteria().andUsernameEqualTo(user.getUsername());
        List<TbUser> users = userMapper.selectByExample(userExample);
        if (users == null || users.size() == 0)
            return KuPinResult.notOk("用户名不存在！");
        if (users.get(0).getPassword() != null && !users.get(0).getPassword().equals(EncryptUtils.encrypt(user.getPassword())))
            return KuPinResult.notOk("密码错误！");

        logger.info(user.getUsername() + " 登陆成功！");

        //2、 登录成功后生成 token。 Token 相当于原来的 sessionId， 字符串， 可以使用 uuid。
        String token = UUID.randomUUID().toString();

        //3、 把用户信息保存到 redis。 Key 就是 “前缀:token”， value 就是 TbUser 对象转换成 json。
        //使用SimplePropertyPreFilter指定需要序列化的属性
        SimplePropertyPreFilter filter = new SimplePropertyPreFilter(TbUser.class, "id", "username", "phone", "email");
        String json = JSON.toJSONString(users.get(0), filter);
        jedisClient.set(user_info_prefix + token, json);

        //4、 设置 key 的过期时间。 模拟 Session 的过期时间。 一般半个小时。
        jedisClient.expire(user_info_prefix + token, user_info_lifetime);

        //5、 返回 KupinResult 包装 token。
        return KuPinResult.ok(token);
    }
}
